package com.atom.app.mvi.utils

import androidx.recyclerview.widget.DiffUtil

class DiffUIDataUtil<T : DiffUIDataUtil.UiDataDiffer<T>>(
    private val mOldList: List<T>, private val mNewList: List<T>
) : DiffUtil.Callback() {

    /**
     * val callback = DiffUIDataUtil<R>(adapter.getItems(), words)
       val result = DiffUtil.calculateDiff(callback)
       adapter.getItems().clear()
       adapter.getItems().addAll(words)
       result.dispatchUpdatesTo(adapter)
     */

    // 进行比较的数据类型
    // 范型的目的，就是你是和一个你这个类型的数据进行比较
    interface UiDataDiffer<T> {
        // 传递一个旧的数据给你，问你是否和你标示的是同一个数据
        fun isSame(old: T): Boolean

        // 你和旧的数据对比，内容是否相同
        fun isUiContentSame(old: T): Boolean
    }

    override fun getOldListSize(): Int = mOldList.size

    override fun getNewListSize(): Int = mNewList.size

    // 两个类是否就是同一个东西，比如Id相等的User
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
        mNewList[newItemPosition].isSame(mOldList[oldItemPosition])

    // 在经过相等判断后，进一步判断是否有数据更改
    // 比如，同一个用户的两个不同实例，其中的name字段不同
    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
        mNewList[newItemPosition].isUiContentSame(mOldList[oldItemPosition])
}